Skip to content

fix(recompiler): read P20 of a flat input as the provoking vertex - #8538

Merged
adriadam10 merged 1 commit into
boykopovar:mainfrom
LeandroLP23:fix/recompiler-flat-p20-provoking
Oct 22, 2026
Merged

adriadam10 merged 1 commit into
boykopovar:mainfrom
LeandroLP23:fix/recompiler-flat-p20-provoking

Conversation

@LeandroLP23

Copy link
Copy Markdown
Contributor

What

A FLAT_SHADE input without pass-through that a pixel shader reads through v_interp_mov_f32 P20 and not P10 now returns the provoking vertex's value, like P0, and like P10 since #4030. Before, P20 kept the input explicitly per vertex and read vertex 2 minus vertex 0. For a flat value, that difference is 0 on every vertex, and with the first provoking vertex nothing refused the draw.

Why. ps5-opengl lowers every flat input to a load of a single vertex in lower_flat_input_vertex (toolchain/opengnm-psbc-ps5.patch, mirror):

That driver passes the GL 4.6 CTS on a PS5, the argument #4030 rests on (#1413).

Seen in SuperTuxKart. SuperTuxKart (PPSA69421) draws its deferred point lights this way. All 12 flat inputs of pointlight.frag (center, energy, col, radius, direction_scale_offset) are read through P20 under the first provoking vertex, so on main they are all 0. att = energy * 20. / (1. + d * d) * (radius - d) / radius is then 0 * -inf, which is NaN; if (att <= 0.) discard; is false for NaN, so nothing is discarded. The light's whole screen-space quad writes NaN into the light accumulation targets, and the starting-line referee and everything behind it render black. Details in #8364:

  • discarding NaN with a bit test in pointlight.frag also fixes it;
  • the quad's light buffer reads NaN (shown red);
  • the inputs read as zero (radius exactly 0).

Changes.

  • ShaderInfoCollector keeps a flat input per vertex only when it is read through both P10 and P20. The existing "differences to vertex 0" cases in agc_driver_graphics and agc_shader_memory read both, and are unchanged.
  • FragmentParameter gains flatP20, set the same way as flatP10 and stored in the shader disk cache.
  • ValidateProvokingVertex throws v_interp_mov p20 of a flat input with the last provoking vertex is not measured with the last provoking vertex. Neither combination was measured on a console, so the pairing that ps5-opengl doesn't produce throws, as for P10 under the first.
  • The debt entry says the same.

Tested

Windows 11 Home 26300, AMD Radeon 860M (1002:1114, driver 32.0.13058.8001), WinLibs GCC 15.2.0, Release, ANYPS5_REQUIRE_VULKAN=1, based on main 75787d2.

  • agc_driver_graphics gets a P20 case mirroring fix(recompiler): read P10 of a flat input as the provoking vertex #4030's P10 one. The input compiles to a flat input; flatP20 is set and flatP10 is not; first mode passes; last mode throws. Negative control: with main's ShaderInfoCollector.cpp, SpirvInputOutput.cpp and Pipeline.cpp, it fails with flat v_interp_mov P20 did not compile to a flat input.

  • ctest -R "agc|shader|spirv|recomp" -j4 --timeout 120: 840 of 841 pass, 3 skipped for device features. The one left is agc_driver_image_array_window_past_layer_limit, Not Run because it does not compile with MinGW (requested alignment '65536' exceeds object file maximum 8192, also on main).

  • The 35 tests matching provok|flat|interp|barycentric|rect_list|strip: all 32 that build here pass.

  • SuperTuxKart (PPSA69421 00.001.000), tutorial race started through APS5_PAD_INPUT_FILE, unmodified game files. The referee during "Ready! / Set! / Go!":

    • main: black rectangle and black bird on every run (more than 10 today, on several main commits);
    • this PR: the blue Thunderbird and its red, yellow and green sign, lit by its red light, in 2 of 2 runs.
  • Other ps5-opengl titles, 60 s each, no input, main and this PR:

    • Homebrew UI Lab (PPSA99050): exits at 5 s on both;
    • VITA5 (PPSA17035), PS5 FSR4 Showcase (PPSA99005), Yamagi Quake II (PPSA99007): alive at 60 s on both.

    The only refusal logged is the existing P10 one (shader library prebuild skipped: ... p10 of a flat input with the first provoking vertex is not measured), on both trees.

  • Not run: the Khronos validation layer (not installed on this machine), and GPUs other than the 860M.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: Fixes AGC: SuperTuxKart (PPSA69421): the referee's point light ignores its discard and blacks out the scene behind it #8364
  • Unblocks: none
  • GPUs tested: AMD Radeon 860M (1002:1114), AMD driver 32.0.13058.8001, Windows 11 26300
  • AI-assisted: yes (Claude Code)

Overlap from tools/pr_overlap.py: #6741 and #7426 change the last-provoking-vertex checks in the same ValidateProvokingVertex. #6741, #7426, #7883, #7893 and #8083 edit the same debt line. None of them reads P20 of a flat input.

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 6741 docs/dev/debt/libSceAgcDriver.md L140
PR 9084 docs/dev/debt/libSceAgcDriver.md L139-140

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 1395 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 2434 docs/dev/debt/libSceAgcDriver.md
PR 4040 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 4448 docs/dev/debt/libSceAgcDriver.md
PR 4449 docs/dev/debt/libSceAgcDriver.md
PR 5058 docs/dev/debt/libSceAgcDriver.md
PR 5372 docs/dev/debt/libSceAgcDriver.md
PR 5441 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 5609 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 5925 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6146 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6186 docs/dev/debt/libSceAgcDriver.md
PR 6188 core/shader/recompiler/Recompiler.hpp
PR 6194 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6223 docs/dev/debt/libSceAgcDriver.md
PR 6235 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Recompiler.hpp
PR 6273 docs/dev/debt/libSceAgcDriver.md
PR 6280 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6292 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6300 docs/dev/debt/libSceAgcDriver.md
PR 6412 core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6481 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6488 core/shader/recompiler/ShaderDiskCache.cpp
PR 6539 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 6548 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6549 docs/dev/debt/libSceAgcDriver.md
PR 6615 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6808 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6867 docs/dev/debt/libSceAgcDriver.md
PR 6868 docs/dev/debt/libSceAgcDriver.md
PR 6879 core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 6924 core/shader/recompiler/ShaderDiskCache.cpp
PR 6946 core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6959 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7201 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
PR 7256 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7275 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7550 core/shader/recompiler/ShaderDiskCache.cpp
PR 7604 docs/dev/debt/libSceAgcDriver.md
PR 7618 docs/dev/debt/libSceAgcDriver.md
PR 7622 core/shader/recompiler/ShaderDiskCache.cpp
PR 7642 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7684 core/shader/recompiler/ShaderDiskCache.cpp
PR 7689 core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 7803 docs/dev/debt/libSceAgcDriver.md
PR 7888 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 7893 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7978 docs/dev/debt/libSceAgcDriver.md
PR 8014 docs/dev/debt/libSceAgcDriver.md
PR 8077 core/shader/recompiler/ShaderDiskCache.cpp
PR 8105 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 8246 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 8281 docs/dev/debt/libSceAgcDriver.md
PR 8395 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8424 docs/dev/debt/libSceAgcDriver.md
PR 8527 docs/dev/debt/libSceAgcDriver.md
PR 8563 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/libSceAgcDriver.md
PR 8564 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8592 docs/dev/debt/libSceAgcDriver.md
PR 8672 docs/dev/debt/libSceAgcDriver.md
PR 8999 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9020 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9086 docs/dev/debt/libSceAgcDriver.md
PR 9335 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9356 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 9387 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9508 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9592 docs/dev/debt/libSceAgcDriver.md
PR 9721 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9748 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9770 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp

@github-actions github-actions Bot added the fix error Closes an issue (Fixes #N) label Oct 20, 2026
@simonbbby

Copy link
Copy Markdown
Contributor

Verified the title fix on Linux / NVIDIA at 97f60203523e062aca107ca77eabfcff4a7a6359.

SuperTuxKart PPSA69421 00.001.000, unchanged pointlight.frag, RTX 3090 / NVIDIA 595.99.02, Ubuntu 24.04, GCC 13.3 Release. Same relinked homebrew and scripted scene (-N -t tutorial --numkarts=1), fresh processes, shader cache and pipeline journal disabled:

Runtime Observed during Ready/Set countdown
Main 5f7e30233 Large black rectangle / black referee
This head, two runs Blue referee and colored light/sign; rectangle absent
This head with only ShaderInfoCollector.cpp, SpirvInputOutput.cpp and Pipeline.cpp restored from its parent Black rectangle returns

Each counted process completed the same approximately 67-second capture window and exited normally after SIGINT. The restored-head run was made after the negative-control process had fully exited.

Linux prerequisite: every title arm includes only #7897's ApplicationHeap.cpp production hunk, needed here to get past the unrelated empty allocator-table startup failure. The PR and reverted arms use byte-identical libc.prx. This is not a claim that unmodified Linux main reaches the race.

Focused control: temporarily adding a dispatch directly to the existing ProvokingVertexTests() gives 3/3 failures with those three production files reverted (flat v_interp_mov P20 did not compile to a flat input) and 3/3 passes after restoring them. The full stock agc_driver_graphics and agc_shader_memory CTests also pass, 2/2, after removing the temporary entry point and allocator prerequisite and rebuilding.

This supports the flat-input correction, rather than our earlier kill/target-preservation hypotheses. No Khronos validation layer is installed here; no validation-layer or console-semantics claim. No retail titles tested. The temporary edits are removed.

@dantdmdarealguy

Copy link
Copy Markdown
Contributor

Windows 11 Pro, Intel Core i9-14900K, 128 GB, NVIDIA GeForce RTX 5080 (driver 32.0.16.1742), WinLibs GCC 15.2.0, Release, BUILD_TESTING=ON. Head 97f6020352 and its merge base 75787d2f64, built one after the other in the same build directory. Every test log names Selected GPU name=NVIDIA GeForce RTX 5080 vendor=0x10de device=0x2c02 subgroup=32. This adds Windows + NVIDIA to the description's Windows/Radeon 860M and simonbbby's Linux/RTX 3090 results.

SuperTuxKart (PPSA69421 00.001.000, catalog release)

  • Relinked from each build with relinker --windows --registry --trap-sdk-syscall-stubs and started as app.exe -N -t tutorial --numkarts=1 with ANYPS5_NO_SHADER_CACHE=1. Each run was 60 s with no input and a screenshot every 4 s.
  • Base: from the first frames of the tutorial race to the "Set!" at 57 s, a large black rectangle covers the referee and everything behind it, in the upper left of the track.
  • Head: no rectangle. The blue Thunderbird and its starting light (red at 30 s, orange at 50 s) draw in front of the classroom.
  • Both exit 0 on WM_CLOSE with no exception.
  • Both run at the same 2.2 to 2.8 FPS (window title) with the shader cache off. The countdown is still at "Set!" at 57 s on both, so neither run reached "Go!".

Tests, with ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1

  • ctest -R "^(agc_driver_graphics|agc_shader_memory|patched_libraries)$|provok|interp|barycentric|rect_list|strip": 17 of 17 pass on both base and head. That set includes agc_driver_provoking_vertex, agc_driver_mesh_provoking_vertex, agc_driver_mesh_provoking_layer, both agc_driver_rect_list_*, agc_driver_interpolation_modes, agc_driver_interpolation_f16 and both barycentric emulation tests.
  • Validation layer: agc_driver_graphics and agc_shader_memory with VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation (Khronos 1.4.363; VK_LOADER_DEBUG shows it loading). Both pass on base and head. Neither log has a VUID- line or was not found but was requested by env var VK_INSTANCE_LAYERS.
  • Negative control: the head's Graphics.cpp with the base's ShaderInfoCollector.cpp, SpirvInputOutput.cpp and Pipeline.cpp fails:
    AGC graphics: flat v_interp_mov P20 did not compile to a flat input
    
    So the new case fails without the change on NVIDIA too.
  • The incremental head build has no warnings in files the PR touches; the two warnings are -Wstringop-overread in libstdc++'s stl_algobase.h while compiling the untouched PipelineLibrary.cpp, which the base build also prints. tools/check_conventions.py --base 75787d2f6: 0 errors. Its only finding is the debt-length warning on the provoking-vertex entry, which was already over 1000 characters before this change. The branch merges into current main aa1b1bfce without conflicts.
Base 75787d2f6, 30 s Head 97f602035, 30 s
base: black rectangle over the referee head: referee and starting light drawn

Verdict: works on Windows with an RTX 5080. The SuperTuxKart black rectangle is gone, the new test fails without the change, and no related test or validation result changed.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The P20 handling is consistent with the existing P10 model: flat inputs read only through P20 remain flat, the collector marks P20 use separately, and pipeline validation rejects the unmeasured provoking-vertex combination. The cache artifact stores the new flag, and its generated source-version hash covers the recompiler/cache sources. The added focused graphics test checks first/last provoking behavior, and the independent Linux/NVIDIA and Windows/NVIDIA title reports on this head confirm the SuperTuxKart symptom is fixed with the shader unchanged. Hosted runtime/build jobs were skipped, so I am relying on those reported exact-head runs plus static review.

@LeandroLP23

Copy link
Copy Markdown
Contributor Author

Rebased onto main 2c4b116da9 as 3d4a230d16. The conflict was with the barycentric-patches early return that main added to ValidateProvokingVertex. The P20 check now runs before it, so a last-provoking pipeline whose pixel shader has a P20-only flat read still throws when the generated barycentric stages are used. The debt entry keeps main's barycentric exception and this PR's P20 sentences.

Radeon 860M, Windows 11, AMD 32.0.13058.8001, ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1, built with -k 0; the only target that doesn't build is ImageArrayWindowPastLayerLimit.cpp, as on main:

  • 35/35 pass: agc_driver_graphics, agc_driver_provoking_vertex, agc_driver_mesh_provoking_*, agc_driver_interpolation_*, agc_shader_disk_cache* and agc_driver_flat_*.
  • 9/9 pass: tessellation|barycentric|rect_list.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 21, 2026
@adriadam10 adriadam10 self-assigned this Oct 21, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 21, 2026
@LeandroLP23
LeandroLP23 force-pushed the fix/recompiler-flat-p20-provoking branch from 3d4a230 to 93c1b09 Compare October 21, 2026 19:55
@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 21, 2026
A FLAT_SHADE input without pass-through that a pixel shader reads
through v_interp_mov_f32 P20 and not P10 stayed an explicit per-vertex
input and read vertex 2 minus vertex 0. For a flat value that is the same
on every vertex the difference is 0, and with the first provoking vertex
nothing refused it.

ps5-opengl lowers every flat input to a load of one vertex: vertex 1
(P10) by default, which boykopovar#4030 reads as the provoking vertex, and vertex 2
(P20) for triangles when GL's flatshade_first is set. SuperTuxKart's
deferred point lights are drawn that way, so all twelve flat inputs of
pointlight.frag read 0, the attenuation 0 * -inf was NaN, nothing was
discarded, and the starting-line referee's light quad blacked out the
scene behind it (boykopovar#8364).

A P20-only read now returns the provoking vertex's value, as P10 and P0
do. The lane was not measured on the console either, so FragmentParameter
records it and a pipeline using the last provoking vertex throws. An input
read through both P10 and P20 keeps its per-vertex differences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adriadam10
adriadam10 force-pushed the fix/recompiler-flat-p20-provoking branch from 93c1b09 to 1bf43f9 Compare October 22, 2026 17:04
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 22, 2026
@adriadam10
adriadam10 merged commit 0def01b into boykopovar:main Oct 22, 2026
10 checks passed
@adriadam10

Copy link
Copy Markdown
Collaborator

Rebased onto current main and merged the debt entry by hand: the P20 sentence now sits in main's PROVOKING_VTX_LAST line next to the strips entry. Code unchanged. Checked the collector/backend split of P10 and P20 reads, the disk-cache field, the last-mode refusal ahead of the barycentric early return, and the new graphics case; confirmed on SuperTuxKart by @simonbbby (Linux, RTX 3090) and @dantdmdarealguy (Windows, RTX 5080); merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* docs fix error Closes an issue (Fixes #N) shader core/shader

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AGC: SuperTuxKart (PPSA69421): the referee's point light ignores its discard and blacks out the scene behind it

5 participants